﻿Shader "UnityShadersBook/Chapter07/Chapter07-RampTexture"
{
    Properties
    {
        _Color( "Color Tint",Color) = (1,1,1,1 )
        _RampTex( "Ramp Tex", 2D ) =  "white"{}
        _Specular( "Specular", Color ) = ( 1,1,1,1 )
        _Gloss( "Gloss", Range( 8.0, 256 ) ) = 20
    }
    SubShader
    {
        // No culling or depth
        // Blend SrcAlpha OneMinusSrcAlpha
        // Tags { "RenderType"="Opaque" }
		// LOD 100

        Pass
        {
            Tags { "LightMode" = "ForwardBase" }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            fixed4 _Color;
            sampler2D _RampTex;
            float4 _RampTex_ST;
            fixed4 _Specular;
            float _Gloss;

            // struct appdata
            // {
            //     float4 vertex : POSITION;
            //     float3 normal : NORMAL;
            //     float2 texcoord : TEXCOORD0;
            // };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float3 worldNormal : TEXCOORD0;
                float3 worldPos : TEXCOORD1;
                float2 uv : TEXCOORD2;
            };

            // v2f vert (appdata_base v)
			// {
			// 	v2f o;
			// 	o.pos = UnityObjectToClipPos(v.vertex);
			// 	fixed3 worldNormal = UnityObjectToWorldNormal( v.normal);
			// 	o.worldNormal = worldNormal;
			// 	o.worldPos = mul(unity_ObjectToWorld, v.vertex);
			// 	o.uv = TRANSFORM_TEX(v.texcoord, _RampTex);//v.texcoord.xy * _RampTex_ST.xy + _RampTex_ST.zw;
			// 	return o;
			// }

            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.worldNormal = UnityObjectToWorldNormal( v.normal );
                o.worldPos =  mul( unity_ObjectToWorld, v.vertex ).xyz;
                o.uv = TRANSFORM_TEX( v.texcoord, _RampTex );
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed3 worldNormal = normalize( i.worldNormal );
                fixed3 worldLight = normalize( UnityWorldSpaceLightDir( i.worldPos ) );

                //fixed3 albedo = tex2D( _MainTex, i.uv ).rgb * _Color.rgb;

                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

	            //漫反射
				fixed3 worldLightDir = UnityWorldSpaceLightDir(i.worldPos);
				fixed halfLambert = dot(worldLightDir,i.worldNormal)*0.5+0.5;
				fixed3 diffuse = _LightColor0.rgb * tex2D(_RampTex, fixed2(halfLambert,halfLambert)) * _Color.rgb;


           
                // 高光
                fixed3 viewDir =  normalize( UnityWorldSpaceViewDir( i.worldPos ) );  //normalize(  _WorldSpaceCameraPos.xyz - i.worldPos );
                fixed3 halfDir = normalize( worldLight + viewDir );                
                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate( dot( i.worldNormal,halfDir ) ),_Gloss);


                fixed3 color = ambient +  diffuse+specular;
                return fixed4( color, 1.0);
            }
            ENDCG
        }
    }
}
